// 定义一个循环队列类 MyCircularQueue
class MyCircularQueue
{
public:
    // 构造函数，初始化队列，k 表示队列的最大容量
    MyCircularQueue(int k)
    :_arr(new int[k + 1]) // 动态分配一个大小为 k+1 的整数数组，多出的一个位置用于判断队列满
    ,_capacity(k + 1) // 队列的总容量（包括一个用于判断满的位置）
    ,_begin(0) // 队列的起始位置
    ,_end(0) // 队列的结束位置（下一个插入位置）
    {}
    
    // 入队操作，如果队列未满，则插入元素，返回 true；否则返回 false
    bool enQueue(int value)
    {
        if (!isFull()) // 如果队列未满
        {
            _end %= _capacity; // 确保结束位置在数组范围内（虽然这里对于新的队列实例来说总是 0）

            _arr[_end++] = value; // 在结束位置插入元素，然后结束位置后移
            return true;
        }
        else
        {
            return false; // 队列已满，无法插入
        }
    }
    
    // 出队操作，如果队列不为空，则移除队首元素，返回 true；否则返回 false
    bool deQueue()
    {
        if (!isEmpty()) // 如果队列不为空
        {
            ++_begin; // 起始位置后移
            _begin %= _capacity; // 确保起始位置在数组范围内（循环队列的特性）
            return true;
        }
        else
        {
            return false; // 队列为空，无法移除
        }
    }
    
    // 获取队首元素，如果队列为空，则返回 -1
    int Front()
    {
        if (isEmpty()) // 如果队列为空
            return -1;
        else
            return _arr[_begin]; // 返回起始位置的元素
    }
    
    // 获取队尾元素，如果队列为空，则返回 -1
    int Rear()
    {
        if (isEmpty()) // 如果队列为空
            return -1;
        else
            return _arr[_end - 1]; // 返回结束位置前一个位置的元素（因为结束位置指向下一个插入点）
    }
    
    // 判断队列是否为空
    bool isEmpty()
    {
        if (_end == _begin) // 如果结束位置和起始位置相同，则队列为空
            return true;
        else
            return false;
    }
    
    // 判断队列是否已满
    bool isFull()
    {
        if ((_end + 1) % _capacity == _begin) // 如果下一个插入位置与起始位置相同（考虑循环），则队列已满
            return true;
        else
            return false;
    }
private:
    int *_arr; // 动态分配的整数数组，用于存储队列元素
    int _capacity; // 队列的总容量
    int _begin; // 队列的起始位置
    int _end; // 队列的结束位置（下一个插入位置）
};

/**
 * Your MyCircularQueue object will be instantiated and called as such:
 * MyCircularQueue* obj = new MyCircularQueue(k);
 * bool param_1 = obj->enQueue(value);
 * bool param_2 = obj->deQueue();
 * int param_3 = obj->Front();
 * int param_4 = obj->Rear();
 * bool param_5 = obj->isEmpty();
 * bool param_6 = obj->isFull();
 */
 